package com.mkx.security;

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * JWT令牌提供者，用于生成和验证令牌
 */
@Component
public class JwtTokenProvider {

    @Value("${jwt.secret}")
    private String jwtSecret;

    @Value("${jwt.expiration}")
    private long jwtExpiration;

    /**
     * 生成JWT令牌
     */
    public String generateToken(String userId, String username, String tenantId, String role, String[] permissions) {
        // 设置JWT声明
        Map<String, Object> claims = new HashMap<>();
        claims.put("sub", userId);  // 用户ID作为主题
        claims.put("username", username);
        claims.put("tenantId", tenantId);
        claims.put("role", role);
        claims.put("permissions", permissions);
        claims.put("iat", new Date());  // 签发时间

        // 生成令牌
        return Jwts.builder()
                .setClaims(claims)
                .setExpiration(new Date(System.currentTimeMillis() + jwtExpiration))  // 设置过期时间
                .signWith(SignatureAlgorithm.HS512, jwtSecret)  // 使用HMAC SHA512算法签名
                .compact();
    }

    /**
     * 生成刷新令牌
     */
    public String generateRefreshToken(String userId, String tenantId) {
        // 刷新令牌的过期时间可以设置得更长
        long refreshExpiration = jwtExpiration * 24;  // 例如：24小时

        Map<String, Object> claims = new HashMap<>();
        claims.put("sub", userId);
        claims.put("tenantId", tenantId);
        claims.put("type", "refresh");  // 标记为刷新令牌

        return Jwts.builder()
                .setClaims(claims)
                .setExpiration(new Date(System.currentTimeMillis() + refreshExpiration))
                .signWith(SignatureAlgorithm.HS512, jwtSecret)
                .compact();
    }
}